// fmt: 'yyyy-MM-dd hh:mm:ss'    time: new Date(1554780164000)
export function formatDate(fmt, time) {
  const o = {
    'M+': time.getMonth() + 1, // 月份 4
    'd+': time.getDate(), // 日  9
    'h+': time.getHours(), // 小时 11
    'm+': time.getMinutes(), // 分 22
    's+': time.getSeconds(), // 秒 44
    'q+': Math.floor((time.getMonth() + 3) / 3), // 季度
    'S': time.getMilliseconds(), // 毫秒
  };
  if (/(y+)/.test(fmt)) {
    // RegExp.$1是RegExp的一个属性,指的是与正则表达式匹配的第一个子匹配
    fmt = fmt.replace(RegExp.$1, (time.getFullYear() + '').substr(4 - RegExp.$1.length));  // 这是转换年
  }
  for (const k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ?
        (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
      // o[k] 4 9 11 22 44
      // '00'+o[k] 004 009 0011 0022 0044
      // ..substr(('' + o[k]).length从o[k].length开始截取
    }
  }
  return fmt; // 2019-04-09 11:22:44
}


export function setRound(v,e){ 
  var a=1; 
  for(;e>0;a*=10,e--); 
  for(;e<0;a/=10,e++); 
  return Math.round(v*a)/a; 
}

/**
 * @description 节流函数
 * @param func 执行函数
 * @param wait 间隔时间
 * @param options 立即执行（options.leading=false 表示禁用第一次执行 options.trailing = false 表示禁用停止触发的回调
 * @date 2020-08-19
 */
 export const throttle = (fn, wait=2000, options = {}) => {
  let timer = null;
  let previous = 0;
  let throttled = function() {
    let now = +new Date();
    // remaining 不触发下一次函数的剩余时间
    if (!previous && options.leading === false) previous = now;
    let remaining = wait - (now - previous);
    if (remaining < 0) {
      if (timer) {
          clearTimeout(timer);
          timer = null;
      }
      previous = now;
      fn.apply(this, arguments)
    } else if (!timer && options.trailing !== false) {
      timer = setTimeout(() => {
          previous = options.leading === false ? 0 : new Date().getTime();
          timer = null;
          fn.apply(this, arguments);
      }, remaining);
    }
  }
  return throttled;
}

/**
 * @description 防抖函数
 * @param func 执行函数
 * @param wait 间隔时间
 * @param immediate 立即执行
 * @date 2020-08-19
 */
export const debounce = (fn, wait=1000, immediate=true) => {
  let timer = null;
  return function() {
    if (timer) clearTimeout(timer);
    if (immediate) {
      // 如果已经执行过，不再执行
      var callNow = !timer;
      timer = setTimeout(() => {
          timer = null;
      }, wait)
      if (callNow) {
          fn.apply(this, arguments)
      }
    } else {
      timer = setTimeout(() => {
          console.log(this);
          fn.apply(this, arguments)
      }, wait);
    }
  }
}